包名 结绳.Meng

/*
*
*    @阿杰   Meng
*
*    有问题请联系：q2217444740
*
*/

@外部依赖库("../../安卓基本库/依赖库/androidx/core-1.3.0.aar")
@外部依赖库("../../安卓基本库/依赖库/androidx/collection-1.1.0.jar")
@外部依赖库("../../安卓基本库/依赖库/androidx/recyclerview-1.1.0.aar")
@导入Java("androidx.recyclerview.widget.RecyclerView")
类 高级列表框 : 可视化组件

	@隐藏
	变量 适配器 : 高级列表适配器?
	@隐藏
	变量 布局器 : 布局管理器?

	@code
    public #<高级列表框>(android.content.Context context) {
        super(context);
		getView().addOnScrollListener(new RecyclerView.OnScrollListener() {
         @Override
         public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            #滚动状态(newState);
         }
         @Override
         public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            #滚动事件(dx,dy);
         }
      });
    }

    @Override
    public androidx.recyclerview.widget.RecyclerView onCreateView(android.content.Context context) {
        androidx.recyclerview.widget.RecyclerView view = new androidx.recyclerview.widget.RecyclerView(context);
		view.setLayoutManager((#布局器 = new #<线性布局管理器>(context)).getLM());
        return view;
    }

    @Override
    public androidx.recyclerview.widget.RecyclerView getView() {
        return (androidx.recyclerview.widget.RecyclerView) view;
    }
    @end

	属性写 固定项目大小(是否固定 : 逻辑型)
		code getView().setHasFixedSize(#是否固定);
	结束 属性

	属性写 冻结布局(是否冻结 : 逻辑型)
		code getView().setLayoutFrozen(#是否冻结);
	结束 属性

	方法 滚动到(索引 : 整数, 动画时长 : 小数 = 0)
		@code
		if(#动画时长 == 0f){
			getView().scrollToPosition(#索引);
		} else {
			androidx.recyclerview.widget.LinearSmoothScroller s = new androidx.recyclerview.widget.LinearSmoothScroller(#取安卓环境()){
    			@Override
    			protected float calculateSpeedPerPixel(android.util.DisplayMetrics displayMetrics) {
        			return ((float)#动画时长) / displayMetrics.densityDpi;
    			}
    			@Override
    			protected void onTargetFound(android.view.View targetView, RecyclerView.State state, Action action) {
        			int dy = calculateDyToMakeVisible(targetView, getVerticalSnapPreference());
        			int time = calculateTimeForDeceleration(dy);
        			if (time > 0) action.update(0, -dy, time, mDecelerateInterpolator);
    			}
			};
			s.setTargetPosition(#索引);
			getView().getLayoutManager().startSmoothScroll(s);
		}
		@end
	结束 方法

	方法 置布局管理器(布局管理器 : 布局管理器)
		code getView().setLayoutManager((#布局器 = #布局管理器).getLM());
		code #布局器.rv = this;
	结束 方法

	属性写 支持嵌套滚动(是否支持 : 逻辑型)
		code getView().setNestedScrollingEnabled(#是否支持);
	结束 属性

	方法 置适配器(适配器 : 高级列表适配器)
		本对象.适配器 = 适配器
		code #适配器.置列表(this);
		code getView().setAdapter(#适配器);
	结束 方法

	方法 取适配器() : 高级列表适配器
		返回 适配器
	结束 方法

	方法 取布局管理器() : 布局管理器
		返回 布局器
	结束 方法

	方法 内容高度() : 整数
		code return getView().computeVerticalScrollRange();
	结束 方法
	
	方法 内容宽度() : 整数
		code return getView().computeHorizontalScrollRange();
	结束 方法

	方法 显示区域高度() : 整数
		code return getView().computeVerticalScrollExtent();
	结束 方法
	
	方法 显示区域宽度() : 整数
		code return getView().computeHorizontalScrollExtent();
	结束 方法

	方法 已滚动高度() : 整数
		code return getView().computeVerticalScrollOffset();
	结束 方法
	
	方法 已滚动宽度() : 整数
		code return getView().computeHorizontalScrollOffset();
	结束 方法
	
	方法 是否到顶() : 逻辑型
		code return !getView().canScrollVertically(-1);
	结束 方法
	
	方法 是否到底() : 逻辑型
		code return !getView().canScrollVertically(1);
	结束 方法

	// 1:被拖拽， 2:惯性滚动， 0:停止
	定义事件 滚动状态(状态 : 整数)

	//手动滑动时触发
	定义事件 滚动事件(X : 整数, Y : 整数)

结束 类

@导入Java("androidx.recyclerview.widget.RecyclerView")
@后缀代码("extends androidx.recyclerview.widget.RecyclerView.Adapter")
@全局类
类 高级列表适配器

	@隐藏
	变量 数据 : 集合?
	@隐藏
	变量 列表 : 高级列表框?
	@隐藏
	变量 环境 : 安卓环境?

	@code
	public #<高级列表适配器>(java.util.ArrayList l){
		#数据 = l;
	}
	
	public void 置列表(#<高级列表框> l){
		this.#列表 = l;
		this.#环境 = #<列表.取安卓环境>();
	}
	@end

	@静态
	方法 创建适配器(集合 : 集合) : 高级列表适配器
		code return new #<高级列表适配器>(#集合);
	结束 方法

	@嵌入式代码
	@运算符重载
	方法 =(集合 : 集合)
		code new #<高级列表适配器>(#集合);
	结束 方法

	方法 更新项目()
		code this.notifyDataSetChanged();
	结束 方法

	方法 更新指定项目(索引 : 整数, 数量 : 整数 = 1)
		code if(#数量==1) this.notifyItemChanged(#索引);
		code else this.notifyItemRangeChanged(#索引,#数量);
	结束 方法

	方法 更新插入项目(索引 : 整数, 数量 : 整数 = 1)
		code if(#数量==1) this.notifyItemInserted(#索引);
		code else this.notifyItemRangeInserted(#索引,#数量);
	结束 方法

	方法 更新移动项目(移动索引 : 整数, 目标索引 : 整数)
		code this.notifyItemMoved(#移动索引,#目标索引);
	结束 方法

	方法 更新移除项目(索引 : 整数, 数量 : 整数 = 1)
		code if(#数量==1) this.notifyItemRemoved(#索引);
		code else this.notifyItemRangeRemoved(#索引,#数量);
	结束 方法

	方法 取项目类型(索引 : 整数) : 整数
		code return this.getItemViewType(#索引);
	结束 方法

	方法 取项目总数() : 整数
		code return this.getItemCount();
	结束 方法

	方法 取数据() : 集合
		返回 数据
	结束 方法
	
	方法 替换数据(集合 : 集合)
		本对象.数据 = 集合
	结束 方法

	方法 取列表() : 高级列表框
		返回 列表
	结束 方法

	方法 取布局管理器() : 布局管理器
		返回 取列表().取布局管理器()
	结束 方法

	@隐藏
	变量 容器 : 组件容器?
	@code
   @Override
   public RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup parent, int viewType) {
	  return new MyVH(#容器 = #关联视图(viewType));
   }
   
   @Override
   public void onBindViewHolder(RecyclerView.ViewHolder holder,final int position){
	  #关联视图数据(getItemViewType(position), ((MyVH)holder).容器, position);
   }

   @Override
   public int getItemCount() {
      return #数据.size();
   }

   @Override
   public int getItemViewType(int position){
      return #关联项目类型(position);
      //return super.getItemViewType(position);
   }

   class MyVH extends RecyclerView.ViewHolder{
	  public #<组件容器> 容器;
      public MyVH(#<组件容器> r) {
         super(r.getLayout().getView());
         (容器 = r).getLayout().getView().setLayoutParams(new android.view.ViewGroup.LayoutParams(#<容器.取用户布局>().getView().getLayoutParams()));
      }
   }
   @end

	定义事件 关联项目类型(索引 : 整数) : 整数
	定义事件 关联视图(项目类型 : 整数) : 组件容器
	定义事件 关联视图数据(项目类型 : 整数, 容器 : 组件容器, 索引 : 整数)

	@静态
	方法 高级列表适配器(集合 : 集合) : 高级列表适配器
		变量 适配器 : 高级列表适配器 = 集合
		返回 适配器
	结束 方法
	
	@静态
	方法 创建高级列表适配器(集合 : 集合) : 高级列表适配器
		变量 适配器 : 高级列表适配器 = 集合
		返回 适配器
	结束 方法

结束 类